package com.ruoyi.web.controller.unit;

import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.deepoove.poi.config.ConfigureBuilder;
import com.deepoove.poi.data.RowRenderData;
import com.deepoove.poi.data.Rows;
import com.deepoove.poi.policy.DynamicTableRenderPolicy;
import com.deepoove.poi.policy.TableRenderPolicy;
import com.deepoove.poi.util.PoitlIOUtils;
import com.deepoove.poi.util.TableTools;
import com.ruoyi.system.domain.ServerTableData;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.poi.xwpf.usermodel.XWPFTable;
import org.apache.poi.xwpf.usermodel.XWPFTableRow;

import java.util.*;

public class ServerTablePolicy extends DynamicTableRenderPolicy {
    @Override
    public void render(XWPFTable xwpfTable, Object tableData) throws Exception {
        if (null == tableData) {
            return;
        }

        // 参数数据声明
        ServerTableData serverTableData = (ServerTableData) tableData;
        List<RowRenderData> serverDataList = serverTableData.getServerDataList();
        List<Map<String, Object>> groupDataList = serverTableData.getGroupDataList();
        Integer mergeColumn = serverTableData.getMergeColumn();

        if (CollectionUtils.isNotEmpty(serverDataList)) {
            // 先删除一行, demo中第一行是为了调整 三线表 样式
            xwpfTable.removeRow(1);

            // 行从中间插入, 因此采用倒序渲染数据
            for (int i = serverDataList.size() - 1; i >= 0; i--) {
                XWPFTableRow newRow = xwpfTable.insertNewTableRow(1);
                newRow.setHeight(400);
                for (int j = 0; j < 8; j++) {
                    newRow.createCell();
                }
                // 渲染一行数据
                TableRenderPolicy.Helper.renderRow(newRow, serverDataList.get(i));
            }


            //1 处理合并设定速度（m/s）
            for (int t = 0; t < serverDataList.size(); t++) {
                // 获取要合并的名称那一列数据 mergeColumn代表要合并的列，从0开始
                String typeNameData = serverDataList.get(t).getCells().get(mergeColumn).getParagraphs().get(0).getContents().get(0).toString();
                for (int j = 0; j < groupDataList.size(); j++) {
                    String typeNameTemplate = String.valueOf(groupDataList.get(j).get("typeName"));
                    int listSize = Integer.parseInt(String.valueOf(groupDataList.get(j).get("listSize")));
                    // 若匹配上 就直接合并
                    if (typeNameTemplate.equals(typeNameData)) {
                        TableTools.mergeCellsVertically(xwpfTable, 0, t + 1, t+ listSize);
                        t= t+ listSize - 1;
                        break;
                    }
                }
            }
            // 2处理合并自校距离（m）	方向	测次	自校时间（s）
            for (int i = 0; i < serverDataList.size(); i++) {
                // 获取要合并的名称那一列数据 mergeColumn代表要合并的列，从0开始
                String typeNameData = serverDataList.get(i).getCells().get(1).getParagraphs().get(0).getContents().get(0).toString();
                for (int j = 0; j < groupDataList.size(); j++) {
                    String typeNameTemplate = String.valueOf(groupDataList.get(j).get("testIntervalName"));
                    String typeNameTemplateSize = String.valueOf(groupDataList.get(j).get("testIntervalSize"));
                    int listSize = 0;
                    if(!"null".equals(typeNameTemplateSize)){
                        listSize = Integer.parseInt(String.valueOf(groupDataList.get(j).get("testIntervalSize")));
                    }


                    // 若匹配上 就直接合并
                    if (typeNameTemplate.equals(typeNameData)) {
                        TableTools.mergeCellsVertically(xwpfTable, 1, i + 1, i + listSize);

                        i = i + listSize - 1;
                        break;
                    }
                }
            }

            // 3方向
            for (int i = 0; i < serverDataList.size(); i++) {
                // 获取要合并的名称那一列数据 mergeColumn代表要合并的列，从0开始
                String typeNameData = serverDataList.get(i).getCells().get(2).getParagraphs().get(0).getContents().get(0).toString();
                for (int j = 0; j < groupDataList.size(); j++) {
                    String typeNameTemplate = String.valueOf(groupDataList.get(j).get("orientationName"));
                    String typeNameTemplateSize = String.valueOf(groupDataList.get(j).get("orientationSize"));
                    int listSize = 0;
                    if(!"null".equals(typeNameTemplateSize)){
                        listSize = Integer.parseInt(String.valueOf(groupDataList.get(j).get("orientationSize")));
                    }


                    // 若匹配上 就直接合并
                    if (typeNameTemplate.equals(typeNameData)) {
                        TableTools.mergeCellsVertically(xwpfTable, 2, i + 1, i + listSize);

                        i = i + listSize - 1;
                        break;
                    }
                }
            }
            // 4测次
            for (int i = 0; i < serverDataList.size(); i++) {
                // 获取要合并的名称那一列数据 mergeColumn代表要合并的列，从0开始
                String typeNameData = serverDataList.get(i).getCells().get(3).getParagraphs().get(0).getContents().get(0).toString();
                for (int j = 0; j < groupDataList.size(); j++) {
                    String typeNameTemplate = String.valueOf(groupDataList.get(j).get("frequencyName"));
                    String typeNameTemplateSize = String.valueOf(groupDataList.get(j).get("frequencySize"));
                    int listSize = 0;
                    if(!"null".equals(typeNameTemplateSize)){
                        listSize = Integer.parseInt(String.valueOf(groupDataList.get(j).get("frequencySize")));
                    }


                    // 若匹配上 就直接合并
                    if (typeNameTemplate.equals(typeNameData)) {
                        TableTools.mergeCellsVertically(xwpfTable, 3, i + 1, i + listSize);

                        i = i + listSize - 1;
                        break;
                    }
                }
            }
            // 5自校时间（s）
            for (int i = 0; i < serverDataList.size(); i++) {
                // 获取要合并的名称那一列数据 mergeColumn代表要合并的列，从0开始
                String typeNameData = serverDataList.get(i).getCells().get(4).getParagraphs().get(0).getContents().get(0).toString();
                for (int j = 0; j < groupDataList.size(); j++) {
                    String typeNameTemplate = String.valueOf(groupDataList.get(j).get("absTimeName"));
                    String typeNameTemplateSize = String.valueOf(groupDataList.get(j).get("absTimeSize"));
                    int listSize = 0;
                    if(!"null".equals(typeNameTemplateSize)){
                        listSize = Integer.parseInt(String.valueOf(groupDataList.get(j).get("absTimeSize")));
                    }


                    // 若匹配上 就直接合并
                    if (typeNameTemplate.equals(typeNameData)) {
                        TableTools.mergeCellsVertically(xwpfTable, 4, i + 1, i + listSize);

                        i = i + listSize - 1;
                        break;
                    }
                }
            }
            // 6实测速度（m/s）
            for (int i = 0; i < serverDataList.size(); i++) {
                // 获取要合并的名称那一列数据 mergeColumn代表要合并的列，从0开始
                String typeNameData = serverDataList.get(i).getCells().get(5).getParagraphs().get(0).getContents().get(0).toString();
                for (int j = 0; j < groupDataList.size(); j++) {
                    String typeNameTemplate = String.valueOf(groupDataList.get(j).get("absSpeedName"));
                    String typeNameTemplateSize = String.valueOf(groupDataList.get(j).get("absSpeedSize"));
                    int listSize = 0;
                    if(!"null".equals(typeNameTemplateSize)){
                        listSize = Integer.parseInt(String.valueOf(groupDataList.get(j).get("absSpeedSize")));
                    }


                    // 若匹配上 就直接合并
                    if (typeNameTemplate.equals(typeNameData)) {
                        TableTools.mergeCellsVertically(xwpfTable, 5, i + 1, i + listSize);

                        i = i + listSize - 1;
                        break;
                    }
                }
            }
        }
    }


}
